package com.supermap.dataservice.user;

import com.alibaba.dubbo.config.annotation.Service;
import com.alibaba.dubbo.rpc.RpcContext;
import com.supermap.dataservice.redis.JedisClient;
import com.supermap.dataservice.user.dao.UserDao;
import com.supermap.dataservice.util.JSONUtil;
import com.supermap.dataservice.util.MD5Util;
import com.supermap.dubbo.api.user.LoginService;
import com.supermap.dubbo.api.user.entity.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;

import javax.annotation.Resource;
import java.util.List;

/**
 * @Author:langhongshuai
 * @Description:登陆业务逻辑层
 * @Date:18/1/9 下午3:08
 */
@Service
public class LoginServiceImpl implements LoginService {

    /**
     *使用指定类初始化日志对象，在日志输出的时候，可以打印出日志信息所在类
     */
    protected static final Logger logger = LoggerFactory.getLogger(LoginServiceImpl.class);
    @Resource
    private UserDao userDao;

    //初始化MD5工具类
    private MD5Util md5Util = new MD5Util();

    @Autowired
    private JedisClient jedisClient;

    //设置时间过期为2个小时
    private static final Integer SESSION_EXPIRE=60*60*2;

    @Override
    public JSONUtil login(String userName,String password) {
        //初始化Json封装工具类
        JSONUtil jsonUtil = new JSONUtil();
        try {
        password =  md5Util.EncoderByMd5(password);
        User user = userDao.Login(userName,password);
        if(user!=null){
            jsonUtil.setMsg("Login success！");
            jsonUtil.setIsSuccess(true);
            jsonUtil.setCode(200);
            jsonUtil.setData(user);
            //3.如果正确生成token
//            String token = UUID.randomUUID().toString();//生成的uuid必不重复
//            jedisClient.set("SESSION:"+ token, jsonUtil.objectToJson(user));
//            //5.设置Session的过期时间
//            try {
//                jedisClient.expire("SESSION:"+ token, SESSION_EXPIRE);
//            } catch (Exception e) {
//                e.printStackTrace();
//            }
        }else{
            //重置密码失败后返回的json数据
            jsonUtil.setMsg("Login failed！");
            jsonUtil.setIsSuccess(false);
            jsonUtil.setCode(100);
        }
        }catch (Exception e) {
            //捕捉数据库异常
            logger.error("LoginServiceImpl=>login=>DaoException:"+e.getMessage());
            //重置密码失败后返回的json数据
            jsonUtil.setMsg("Login failed！=>DaoException");
            jsonUtil.setIsSuccess(false);
            jsonUtil.setCode(100);
        }

        return jsonUtil;
    }

    @Override
    public JSONUtil register(User user) {
        //初始化Json封装工具类
        JSONUtil jsonUtil = new JSONUtil();
        try {
            user.setPassword(md5Util.EncoderByMd5(user.getPassword()));
            userDao.register(user);
            user.setId(userDao.selectId());
            if(user!=null){
                jsonUtil.setMsg("register success！");
                jsonUtil.setIsSuccess(true);
                jsonUtil.setCode(200);
                jsonUtil.setData(user);
            }else{
                //重置密码失败后返回的json数据
                jsonUtil.setMsg("register failed！");
                jsonUtil.setIsSuccess(false);
                jsonUtil.setCode(100);
//       logger.info("UserServiceImpl=>resetPassword=>fail");
            }
        }catch (Exception e) {
            //捕捉数据库异常
            logger.error("LoginServiceImpl=>register=>DaoException:"+e.getMessage());
            //重置密码失败后返回的json数据
            jsonUtil.setMsg("register failed！=>DaoException");
            jsonUtil.setIsSuccess(false);
            jsonUtil.setCode(100);
//       logger.info("UserServiceImpl=>resetPassword=>fail");
        }
        return jsonUtil;
    }

    @Override
    public JSONUtil checkMobileAndLoginName(String account) {
        //初始化Json封装工具类
        JSONUtil jsonUtil = new JSONUtil();
        try {
            List<User> users =userDao.checkMobileAndLoginName(account);
            if(users.size()!=0){
                jsonUtil.setMsg("Account is existed！");
                jsonUtil.setIsSuccess(false);
                jsonUtil.setCode(100);
            }else{
                //重置密码失败后返回的json数据
                jsonUtil.setMsg("Account is not existed！");
                jsonUtil.setIsSuccess(true);
                jsonUtil.setCode(200);
            }
        }catch (Exception e) {
            //捕捉数据库异常
            logger.error("LoginServiceImpl=>checkMobileAndLoginName=>DaoException:"+e.getMessage());
            //重置密码失败后返回的json数据
            jsonUtil.setMsg("checkMobileAndLoginName failed！=>DaoException");
            jsonUtil.setIsSuccess(false);
            jsonUtil.setCode(100);
        }
        return jsonUtil;
    }

    @Override
    public JSONUtil getUserByToken(String token) {
        JSONUtil jsonUtil = new JSONUtil();
        // 2、根据token查询redis。
        String json = null;
        try {
            json = jedisClient.get("SESSION:"+ token);
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (jsonUtil.isBlank(json)) {
            // 3、如果查询不到数据。返回用户已经过期。
            jsonUtil.setMsg("用户登录已经过期，请重新登录。");
        }
        // 4、如果查询到数据，说明用户已经登录。
        // 5、需要重置key的过期时间。
        try {
            jedisClient.expire("SESSION:"+ token, SESSION_EXPIRE);
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 6、把json数据转换成TbUser对象，然后使用e3Result包装并返回。
        User user = (User)jsonUtil.jsonToPojo(json);
        jsonUtil.setData(user);
        return jsonUtil;
    }

    @Override
    public JSONUtil logOut(String token) {
        JSONUtil jsonUtil = new JSONUtil();
        // 2、根据token查询redis。
        Long num=0L;
        try {
            num = jedisClient.del("SESSION:"+ token);
        } catch (Exception e) {
            logger.error("LoginServiceImpl=>logOut=>redisException:"+e.getMessage());
            e.printStackTrace();
            jsonUtil.setMsg("redis  userinfo has been deleted！=>redisException");
            jsonUtil.setIsSuccess(false);
            jsonUtil.setCode(100);
        }
        if(num!=1L){
            jsonUtil.setMsg("redis  userinfo has not been deleted！");
            jsonUtil.setIsSuccess(true);
            jsonUtil.setCode(200);
        }else{
            jsonUtil.setMsg("redis  userinfo has been deleted！");
            jsonUtil.setIsSuccess(false);
            jsonUtil.setCode(100);
        }

        return jsonUtil;
    }


}
